package com.wutong.resonance.model.interfaces;

import com.wutong.resonance.model.audio.AudioData;
import com.wutong.resonance.model.plugin.IPlugin;
import com.wutong.resonance.model.plugin.Plugin;
import com.wutong.resonance.model.tool.PluginQueue;

/**
 * 插件处理器接口
 *
 * @author wutong
 */
public interface PluginProcessor {

    PluginQueue getPluginQueue();

    /**
     * 插件处理 原地处理音频数据，不返回值
     *
     * @param audioData 音频数据
     */
    default void process(AudioData audioData) {
        for (Plugin plugin : getPluginQueue()) {
            audioData = plugin.process(audioData);
        }
    }

    /**
     * 注册插件
     *
     * @param plugin 插件
     */
    default void register(Plugin plugin) {
        getPluginQueue().add(plugin);
    }

    /**
     * 注销插件
     *
     * @param plugin 插件
     */
    default void unregister(Plugin plugin) {
        plugin.close();
        getPluginQueue().remove(plugin);
    }

    /**
     * 注册插件
     *
     * @param plugin 插件
     */
    default void register(IPlugin plugin) {
        register((Plugin) plugin);
    }

    /**
     * 注销插件
     *
     * @param plugin 插件
     */
    default void unregister(IPlugin plugin) {
        unregister((Plugin) plugin);
    }

    /**
     * 清空插件队列
     */
    default void clear() {
        for (Plugin plugin : getPluginQueue()) {
            unregister(plugin);
        }
    }
}
